package routers

import (
	"bookmark-web/controller"
	"bookmark-web/middleware"

	"github.com/gin-gonic/gin"
	swaggerFiles "github.com/swaggo/files"
	ginSwagger "github.com/swaggo/gin-swagger"
)

/*
	该文件是主路由器设置，用来将各个 controller 层中的路由统一加载进路由引擎。
	其它路由修改不会影响该文件。
*/

// SetupRouter 设置路由
func SetupRouter() *gin.Engine {
	// 创建gin路由引擎
	r := gin.Default()

	// 添加全局中间件
	r.Use(middleware.CORSMiddleware())   // CORS中间件
	r.Use(middleware.LoggerMiddleware()) // 日志中间件

	// 加载HTML模板
	r.LoadHTMLGlob("templates/*")

	// 静态文件服务
	r.Static("/static", "./static")
	r.Static("/web", "./web")

	// 根路由 - 返回前端应用
	r.GET("/", func(c *gin.Context) {
		c.File("./web/index.html")
	})

	// Swagger API 文档路由
	r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))

	// API路由组
	api := r.Group("/api")
	{
		// 不需要认证的API（用户注册、登录）
		controller.SetupUserRouter(api)

		// 需要JWT认证的API
		authAPI := api.Group("/")
		authAPI.Use(middleware.JWTAuthMiddleware())
		{
			// 分类相关 api
			controller.SetupCategoryRouter(authAPI)
			// 收藏相关 api
			controller.SetupBookmarkRouter(authAPI)

			// 后台管理API，需要管理员权限
			controller.SetupAdminRouter(authAPI)
		}

	}

	// 前端应用路由 - 所有未匹配的路由都返回index.html
	//r.NoRoute(func(c *gin.Context) {
	//	c.File("./web/index.html")
	//})

	return r
}
